/**
 * 与 CPU 有关的工具包
 */

#pragma once

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

#include "std_err.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 使用 SIMD 指令将 int16_t 数组转换为 32bit-float 数组
 * @param int16_array [in] 整数数组
 * @param float_array [out] 浮点数数组
 * @param normalization_bits 浮点数归一化(即所有数据不大于1.0)位数(即整数的有效位数, 不应大于 15 位), 为 0 时不做归一化。
 * @return 标准错误码。STD_ERR_OK 表示正确。
 */
std_err_t simd_int16_to_float(const int16_t *int16Array, float *floatArray, size_t size, size_t normalization_bits);
std_err_t      int16_to_float(const int16_t *int16Array, float *floatArray, size_t size, size_t normalization_bits);

/**
 * 使用 SIMD 指令将 32bit-float 数组转换为 int16_t 数组
 * @param float_array [in] 浮点数数组
 * @param int16_array [out] 整数数组
 * @param normalization_bits 浮点数归一化(即所有数据不大于1.0)位数(即整数的有效位数, 不应大于 15 位), 为 0 时不做归一化。
 * @return 标准错误码。STD_ERR_OK 表示正确。
 */
std_err_t simd_float_to_int16(const float *floatArray, int16_t *int16Array, size_t size, size_t normalization_bits);
std_err_t      float_to_int16(const float *floatArray, int16_t *int16Array, size_t size, size_t normalization_bits);

/**
 * for test only
 */
int simd_test(int argc, const char **argv);

#ifdef __cplusplus
} //extern "C"
#endif
